﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using xplang.abstractions;

namespace xplang.run
{
  //public class ClassScope : Value
  //{
  //  public readonly ClassScope global;

  //  public Value getAttributeValue(Variable variable)
  //  {
  //    return variable.type.getClassDecl().getAttributeValue(this, variable);
  //  }

  //  public void setAttributeValue(Variable variable, Value obj)
  //  {
  //    variable.type.getClassDecl().setAttributeValue(this, variable, obj);
  //  }
  //}

  //public class MethodScope
  //{
  //  public MethodScope(ClassScope global, ClassMethod method, GenericParamDecl[] genericMappings, ClassScope _this, Value _return, Value[] parameters)
  //  {
  //    this.global = global;
  //    this.genericMappings = genericMappings;
  //    this._this = _this;
  //    this.method = method;
  //    this.state = ScopeState.Running;
  //    this._return = _return;
  //    if (method != null)
  //    {
  //      heap = new Value[method.parameters.Length + method.locals.Count];
  //      int n = parameters.Length;
  //      for (int i = 0; i < n; i++)
  //      {
  //        Variable p = method.parameters[i];
  //        init(p, parameters[i]);
  //      }
  //    }
  //  }

  //  public readonly ClassScope global;
  //  public readonly ClassScope _this;
  //  public readonly GenericParamDecl[] genericMappings;
  //  public readonly ClassMethod method;

  //  public readonly Value _return;
  //  public ScopeState state = ScopeState.Running;
  //  public Value[] heap;
  //}

  //public class ScopeXXXX
  //{

  //  public ScopeXXXX(Scope global, ClassMethod method, GenericParamDecl[] genericMappings, Value _this, Value _return, Value[] parameters)
  //  {
  //    this.global = global;
  //    this.genericMappings = genericMappings;
  //    this._this = _this;
  //    this.method = method;
  //    this.state = ScopeState.Running;
  //    this._return = _return;
  //    if (method != null)
  //    {
  //      int n = parameters.Length;
  //      for (int i = 0; i < n; i++)
  //      {
  //        Variable p = method.parameters[i];
  //        init(p, parameters[i]);
  //      }
  //    }
  //  }

  //  public readonly Scope global;
  //  public readonly GenericParamDecl[] genericMappings;
  //  public readonly ClassMethod method;

  //  private Dictionary<Variable, Value> values = new Dictionary<Variable, Value>();
  //  public ScopeState state;
  //  public readonly Value _this;
  //  public readonly Value _return;

  //  public Value get(Variable variable)
  //  {
  //    return values[variable];
  //  }

  //  public void init(Variable variable, Value value)
  //  {
  //    values[variable] = value;
  //  }

  //  public void set(Variable variable, Value value)
  //  {
  //    Value v = values[variable];
  //    if (v.classRef != value.classRef)
  //      v.classRef.attribMethod(value.classRef, null);
  //    else
  //      v.objRef = value.objRef;
  //  }
  //}

}
